#ifndef FIELDPLAYER_OWNED_STATES_H
#define FIELDPLAYER_OWNED_STATES_H
//------------------------------------------------------------------------
//
//  Name:   MinerOwnedStates.h
//
//  Desc:   All the states that can be assigned to the Miner class.
//          Note that a global state has not been implemented.
//
//  Author: Mat Buckland 2002 (fup@ai-junkie.com)
//
//------------------------------------------------------------------------
#include "OgreRefAppState.h"
#include "OgreRefAppFieldPlayer.h"

//------------------------------------------------------------------------
//
//  In this state the miner will walk to a goldmine and pick up a nugget
//  of gold. If the miner already has a nugget of gold he'll change state
//  to VisitBankAndDepositGold. If he gets thirsty he'll change state
//  to QuenchThirst
//------------------------------------------------------------------------
namespace OgreRefApp
{
    struct ApplicationObject::CollisionInfo;

    class FieldPlayer;
    class SoccerPitch;


//------------------------------------------------------------------------
    class GlobalPlayerState : public State<FieldPlayer>
    {
    private:

        GlobalPlayerState(){}

    public:

        //this is a singleton
        static GlobalPlayerState* Instance();

        void Enter(FieldPlayer* player){}

        void Execute(FieldPlayer* player);

        void Exit(FieldPlayer* player){}

        bool OnMessage(FieldPlayer*, ApplicationObject::CollisionInfo&);
    };

//------------------------------------------------------------------------
    class ChaseBall : public State<FieldPlayer>
    {
    private:

        ChaseBall(){}

    public:

        //this is a singleton
        static ChaseBall* Instance();

        void Enter(FieldPlayer* player);

        void Execute(FieldPlayer* player);

        void Exit(FieldPlayer* player);

        bool OnMessage(FieldPlayer*, ApplicationObject::CollisionInfo&)
        {
            return false;
        }
    };

//------------------------------------------------------------------------
    class Dribble : public State<FieldPlayer>
    {
    private:

        Dribble(){}

    public:

        //this is a singleton
        static Dribble* Instance();

        void Enter(FieldPlayer* player);

        void Execute(FieldPlayer* player);

        void Exit(FieldPlayer* player){}

        bool OnMessage(FieldPlayer*, ApplicationObject::CollisionInfo&)
        {
            return false;
        }
    };


//------------------------------------------------------------------------
    class ReturnToHomeRegion: public State<FieldPlayer>
    {
    private:

        ReturnToHomeRegion(){}

    public:

        //this is a singleton
        static ReturnToHomeRegion* Instance();

        void Enter(FieldPlayer* player);

        void Execute(FieldPlayer* player);

        void Exit(FieldPlayer* player);

        bool OnMessage(FieldPlayer*, ApplicationObject::CollisionInfo&)
        {
            return false;
        }
    };

//------------------------------------------------------------------------
    class Wait: public State<FieldPlayer>
    {
    private:

        Wait(){}

    public:

        //this is a singleton
        static Wait* Instance();

        void Enter(FieldPlayer* player);

        void Execute(FieldPlayer* player);

        void Exit(FieldPlayer* player);

        bool OnMessage(FieldPlayer*, ApplicationObject::CollisionInfo&)
        {
            return false;
        }
    };

//------------------------------------------------------------------------
    class KickBall: public State<FieldPlayer>
    {
    private:

        KickBall(){}

    public:

        //this is a singleton
        static KickBall* Instance();

        void Enter(FieldPlayer* player);

        void Execute(FieldPlayer* player);

        void Exit(FieldPlayer* player){}

        bool OnMessage(FieldPlayer*, ApplicationObject::CollisionInfo&)
        {
            return false;
        }
    };

//------------------------------------------------------------------------
    class ReceiveBall: public State<FieldPlayer>
    {
    private:

        ReceiveBall(){}

    public:

        //this is a singleton
        static ReceiveBall* Instance();

        void Enter(FieldPlayer* player);

        void Execute(FieldPlayer* player);

        void Exit(FieldPlayer* player);

        bool OnMessage(FieldPlayer*, ApplicationObject::CollisionInfo&)
        {
            return false;
        }
    };


//------------------------------------------------------------------------
    class SupportAttacker: public State<FieldPlayer>
    {
    private:

        SupportAttacker(){}

    public:

        //this is a singleton
        static SupportAttacker* Instance();

        void Enter(FieldPlayer* player);

        void Execute(FieldPlayer* player);

        void Exit(FieldPlayer* player);

        bool OnMessage(FieldPlayer*, ApplicationObject::CollisionInfo&)
        {
            return false;
        }
    };
}

#endif;
